/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gestores;
import baseDatos.AnimalDAO_facu;
import baseDatos.BateriaDAO;
import baseDatos.CamaraDAO;
import baseDatos.CategoriaDAO;
import baseDatos.CausaMuerteDAO;
import baseDatos.EmpleadoDAO;
import baseDatos.EstadoJaulaDAO;
import baseDatos.FamiliaDAO;
import baseDatos.FechaDAO;
import baseDatos.HistorialDAO;
import baseDatos.JaulaDAO;
import baseDatos.ParametroDAO;
import baseDatos.SexoDAO;
import baseDatos.TipoCamaraDAO;
import baseDatos.TipoEventoDAO;
//import entidades.Animal2;
import entidades.Animal;
import conexion.GestorConexion;
import entidades.Bateria;
import entidades.Camara;
import entidades.EstadoJaula;
import entidades.Historial;
import entidades.Jaula;
import entidades.Sexo;
import entidades.TipoCamara;
import entidades.TipoEvento;
import entidades.Empleado;
import entidades.Parametro;
import java.util.ArrayList;
//import java.sql.Date;
import oracle.sql.DATE;
import java.util.Iterator;

/**
 *
 * @author Facundo
 */
public class GestorProduccionFacu extends GestorConexion{

    public GestorProduccionFacu(){

    }
    
    /*
     * PRIMERA PARTE!!!!!
     * En esta parte se declaran los metodos para insertar o actualizar objetos en la base
     */
    
    /*
     * Metodo para isertar un nuevo historial en la base de datos
     */
    public boolean insertarHistorialMuerte(Historial his){
        boolean ret = false;
        this.conectar();
        ret = new HistorialDAO(this.getCon()).putMuerte(his);
        this.desconectar();
        return ret;
    }
     /*
     * Metodo para isertar un nuevo historial en la base de datos
     */
    public boolean insertarHistorial(Historial his){
        boolean ret = false;
        this.conectar();
        ret = new HistorialDAO(this.getCon()).put(his);
        this.desconectar();
        return ret;
    }
    /*
     * Metodo para insertar un nuevo animal en la base de datos
     */
    public boolean insertarAnimal(Animal ani){
        boolean ret = false;
        this.conectar();
        ret = new AnimalDAO_facu(this.getCon()).put(ani);
        this.desconectar();
        return ret;

    }

    /*
     * Metodo para modificar un animal existente
     */
    public boolean updateAnimal(Animal ani){
        boolean ret = false;
        this.conectar();
        ret = new AnimalDAO_facu().updateDestete(ani);
        this.desconectar();
        return ret;
    }
    /*
     * Metodo para modificar una jaula existente. Se le modifica el estado de la jaula
     */
    public boolean updateJaula(Camara cam, EstadoJaula estado){
        boolean ret = false;
        this.conectar();
         /*
                 * Aka, se declara un iterator para el recorrer un array de baterias, perteneciente a una
                 * determinada camara. Luego se declara otro iterator para recorrer un array de jaulas
                 * pertenecientes a una determinada bateria.                 *
                 */
                Iterator iter = cam.getBateria().iterator();
                Bateria bat = (Bateria) iter.next();
                Iterator iter2 = bat.getJaula().iterator();
                Jaula jau = (Jaula) iter2.next();
                /*
                 * Luego de obtenida la jaula y la bateria, ya que la camara ya la teniamos a trvez del animal,
                 * debemos obtener el codigo de cada una de ellas, para poder insertar el codigo de la jaula,
                 * en la tabla animal.
                 */
                int codigoTipoCamara = new TipoCamaraDAO().devolverCodigoCamara(cam.getTipo_camara().getNombre());
                int codigoCamara = new CamaraDAO().getCodigoCamara(cam.getNombre(), codigoTipoCamara);
                int codigoBateria = new BateriaDAO().devolverCodigoBateria(bat.getNombre(),codigoCamara);
                int codigoJaula = new JaulaDAO().devolverCodigoJaula(jau.getNombre(), codigoBateria);
        int codigoEstado = new EstadoJaulaDAO().devolverCodigoEstadoJaula(estado);
        ret = new JaulaDAO().updateEstadoJaula(codigoJaula, codigoEstado);
        this.desconectar();
        return ret;
    }
    /*
     * FIN PRIMERA PARTE!!!!
     */
//*****************************************************************************************************\\

    /*
     * SEGUNDA PARTE!!!!!
     * En esta parte se declaran los metodos para obtener array de objetos, dependiendo o no
     * de los parametros de entradas..
     */

    /*
     * Metodo que devuelve todas las causas de muertes
     */
    public ArrayList allCausasMuertes(){
        this.conectar();
        ArrayList lista = new CausaMuerteDAO(this.getCon()).getCausaMuertes();
        this.desconectar();
        return lista;
    }
    /*
     * Metodo que devuelve todos los tipos de camaras
     */
    public ArrayList allTipoCamaras(){
        this.conectar();
        ArrayList lista = new TipoCamaraDAO(this.getCon()).getTipoCamaras();
        this.desconectar();
        return lista;
    }
    /*
     * Metodo que devuelve todas las categorias de camaras
     */
    public ArrayList allCategorias(){
        this.conectar();
        ArrayList lista = new CategoriaDAO(this.getCon()).getCategorias();
        this.desconectar();
        return lista;
    }
    /*
     * Trae todo los animales de la base
     */
    public ArrayList allAnimales(){
        this.conectar();
        ArrayList lista=new AnimalDAO_facu(this.getCon()).getAnimales();
        this.desconectar();
        return lista;
    }
     /*
     * Trae todo las baterias de la base
     */
    public ArrayList allBaterias(){
        this.conectar();
        ArrayList lista = new BateriaDAO(this.getCon()).getBaterias();
        this.desconectar();
        return lista;
    }
     /*
      * Trae todo los animales de la base, disponibles para destetar.
      * debe calcular los animales que tienen fechaDestete mayor o igual a la fecha
      * que viene por parametro
      */
    public ArrayList allAnimalesDestete(DATE fecha){
        this.conectar();
        ArrayList lista=new AnimalDAO_facu(this.getCon()).animalesDestetar(fecha);
        this.desconectar();
        return lista;
    }
    /*
     * Metodo que devuelve un array con camaras de acuerdo al tipo, con sus respetivas baterias y sus respetivas
     * jaulas con un determinado estado.
     * Parametros de entrada, tipo de camara y estado de la jaula     *
     */
    public ArrayList allCamaraXTipoBateriaJaulaXEstado(int tipoCamara, int estadoJaula){
        this.conectar();
        ArrayList camaras = new CamaraDAO(this.getCon()).allCamarasBateriaJaula(tipoCamara,estadoJaula);
        this.desconectar();
        return camaras;
    }
    /*
     * Trae todo las jaulas de la base, que pertenescan a una determinada bateria
     */
    public ArrayList allJaulaDeBateria(int codigoBateria, int codigoestado){
        this.conectar();
        System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAZZZZZZZZZZZZZZZZZZZZZZZZZZ: "+ codigoBateria +"SSSS" + codigoestado);
        ArrayList lista = new JaulaDAO(this.getCon()).getJaulaBateriaEstado(codigoestado, codigoBateria);
        this.desconectar();
        return lista;
    }
     /*
     * Trae todas las baterias de la base, que pertenescan a una determinada camara
     */
    public ArrayList allBateriasDeCamara(int codigoCamara){
        this.conectar();
        ArrayList lista = new BateriaDAO(this.getCon()).getBaterias(codigoCamara);
        this.desconectar();
        return lista;
    }

    /*
     * Metodo que trae jaulas pertenecientes a una determinada bateria
     */
    public ArrayList allJaulas(int bateria){
        this.conectar();
        ArrayList lista = new JaulaDAO(this.getCon()).getJaulas(bateria);
        this.desconectar();
        return lista;
    }

    /*
     * FIN SEGUNDA PARTE!!!!
     */
//*****************************************************************************************************\\



    /*
     * TERCERA PARTE!!!!!
     * En esta parte se declaran lso metodos que devuelven un objeto en particular de acuerdo
     * a los parametros de entrada
     */

    /*
     *  Metodo que devuelve un objeto parametro de acuerdo al nombre pasado por parametro
     */
     public Parametro getParametro(String nombre){
         this.conectar();
         Parametro para = new ParametroDAO(this.getCon()).getParametro(nombre);
         this.desconectar();
         return para;

     }
     /*
      * Metodo que me devuelve la letra correspondiente a un año pasado por parametro
      */
     public String getLetra(int año){
         this.conectar();
         String letra = new AnimalDAO_facu(this.getCon()).traerLetra(año);
         this.desconectar();
         return letra;
     }

    /*
     * Metodo que devuelve la fecha del da
     */
     public DATE tomarFechaSistema() {
        this.conectar();
        DATE fecha = new FechaDAO(this.getCon()).tomarFecha();
        this.desconectar();
        return fecha;
    }

     /*
     * Metodo que devuelve un objeto Empleado de acuerdo a su codigo
     */
    public Empleado getEmpleado(int codigo){
        Empleado emp = null;
        this.conectar();
        emp = new EmpleadoDAO(this.getCon()).getEmpleado(codigo);
        this.desconectar();
        return emp;
    }
    /*
     * Metodo que devuelve un objeto Jaula de acuerdo a la bateria que pertenece y su nombre
     */
    public Jaula getJaula(int codigoBateria, String nombre){
        Jaula jau = null;
        this.conectar();
        jau = new JaulaDAO(this.getCon()).getJaula(codigoBateria, nombre);
        this.desconectar();
        return jau;
    }
    /*
     * Metodo que devuelve un objeto Bateria de acuerdo a la camara y su nombre
     */
    public Bateria getBateria(int codigoCamara, String nombre){
        Bateria bat = null;
        this.conectar();
        bat = new BateriaDAO(this.getCon()).getBateria(codigoCamara, nombre);
        this.desconectar();
        return bat;
    }
    /*
     * Metodo que devuelve un objeto Bateria de acuerdo a la camara y su nombre
     */
    public Camara getCamara(int codigoTipoCamara, String nombre){
        Camara cam = null;
        this.conectar();
        cam = new CamaraDAO(this.getCon()).getCamara(codigoTipoCamara, nombre);
        this.desconectar();
        return cam;
    }
    /*
     * Metodo que devuelve el ultimo gazapo registrado en la base de datos.
     * Retorna un objeto animal.
     */
    public Animal getUltimoNacimiento(){
        this.conectar();
        Animal ani = new AnimalDAO_facu(this.getCon()).getUltimoAnimal();
        this.desconectar();
        return ani;
    }
    /*
     * metodo que devuelve un animal, se pasa como parametro el nombre del mismo y la fechaNacimiento.
     * Retorna un objeto animal
     */
      public Animal getAnimal(String nombre, DATE fechaNacimiento){
        this.conectar();
        Animal ani =new AnimalDAO_facu(this.getCon()).getAnimal(nombre, fechaNacimiento);
        this.desconectar();
        return ani;
    }
      /*
       * Metodo que retorna una animal de acuerdo al nombre pasado por parametro. No se debe usar..       *
       */
      public Animal getAnimal(String nombre){
          this.conectar();
          Animal ani = new AnimalDAO_facu(this.getCon()).getAnimal(nombre);
          this.desconectar();
          return ani;
      }
      /*
       * Metodo que retorna una animal hembra de acuerdo al nombre pasado por parametro. No se debe usar..       *
       */
      public Animal getAnimalHembra(String nombre){
          this.conectar();
          Animal ani = new AnimalDAO_facu(this.getCon()).getAnimalHembra(nombre);
          this.desconectar();
          return ani;
      }

     /*
      * Metodo que devuelve un objeto sexo, se pasa como parametro el nombre del mismo. Retorna un
      * objeto Sexo.
      */
     public Sexo getSexo(char nombre){
         this.conectar();
         Sexo sex = new SexoDAO(this.getCon()).getSexo(nombre);
         this.desconectar();
         return sex;
     }
     /*
      * Metodo que devuelve un objeto , se pasa como parametro el nombre del mismo. Retorna un
      * objeto EstadoJaula.
      */
     public EstadoJaula getEstadoJaula(int codigo){
         this.conectar();
         EstadoJaula est = new EstadoJaulaDAO(this.getCon()).getEstadoJaula(codigo);
         this.desconectar();
         return est;
     }
     /*
      * Metodo que devuelve un objeto , se pasa como parametro el nombre del mismo. Retorna un
      * objeto TipoCamara.
      */
     public TipoCamara getTipoCamara(int codigo){
         this.conectar();
         TipoCamara tipo = new TipoCamaraDAO(this.getCon()).getTipoCamara(codigo);
         this.desconectar();
         return tipo;
     }
     
     /*
      * Metodo que devuelve un objeto , se pasa como parametro el nombre del mismo. Retorna un
      * objeto TipoCamara.
      */
     public TipoCamara getTipoCamara(String nombre){
         this.conectar();
         TipoCamara tipo = new TipoCamaraDAO(this.getCon()).getTipoCamara(nombre);
         this.desconectar();
         return tipo;
     }
     /*
      * Metodo que devuelve un objeto , se pasa como parametro el nombre del mismo. Retorna un
      * objeto TipoCamara.
      */
     public TipoEvento getTipoEvento(String nombre){
         this.conectar();
         TipoEvento tipo = new TipoEventoDAO(this.getCon()).getTipoEvento(nombre);
         this.desconectar();
         return tipo;
     }   
     /*
      * Metodo que devuelve un objeto , se pasa como parametro el nombre del mismo. Retorna un
      * objeto Camara.
      */
     public Camara getCamara(int codigoCamara){
         this.conectar();
         Camara cam = new CamaraDAO(this.getCon()).getCamara(codigoCamara);
         this.desconectar();
         return cam;
     }    
     /*
      * Metodo que devuelve un objeto bateria , se pasa como parametro el nombre del mismo. Retorna un
      * objeto Bateria.
      */
     public Bateria getBateria(int codigo){
         this.conectar();
         Bateria bat = new BateriaDAO(this.getCon()).getBateria(codigo);
         this.desconectar();
         return bat;
     }
     /*
      * Metodo que devuelve un objeto , se pasa como parametro el nombre del mismo. Retorna un
      * objeto Jaula.
      */
     public Jaula getJaula(int codigo){
         this.conectar();
         Jaula jau = new JaulaDAO(this.getCon()).getJaula(codigo);
         this.desconectar();
         return jau;
     }     
     /*
      * Metodo que devuelve un animal padre, de acuerdo al nombre de la madre pasada por
      * parametro
      */
     public Animal getPadre(Animal madre){
         Animal ani = null;
         this.conectar();
         ani = new AnimalDAO_facu(this.getCon()).devolverPadre(madre);
         this.desconectar();
         return ani;         
     }
     /*
      * Metodo que devuelve un nuevo nombre para un nuevo animal
      */
//      public String getNuevoNombre(int año){
//        this.conectar();
//        System.out.println(this.getCon()+"dsfsdfdsfsdfsdfsdf");
//        String nombre = new AnimalDAO_facu(this.getCon()).nuevoNombre2(año);
//
//        this.desconectar();
//        return nombre;
//    }
//       public String getNuevoNombre2(DATE fecha){
//        this.conectar();
//        System.out.println(this.getCon()+"dsfsdfdsfsdfsdfsdf");
//        String nombre = new AnimalDAO_facu(this.getCon()).nuevoNombre2(fecha);
//
//        this.desconectar();
//        return nombre;
//    }
    /*
     * Metodo que devuelve el codigo de un tipo de camara, de acuerdo al nombre de la misma
     * recibida por parametro
     */
      public int getCodigoTipoCamara(String nombre){
          this.conectar();
          int cod = new TipoCamaraDAO(this.getCon()).devolverCodigoCamara(nombre);
          this.desconectar();
          return cod;
      }
      /*
       * Metodo que devuelve el codigo del estado de una jaula, de acuerdo al nombre del estado
       * recibido por parametro
       */
      public int getCodigoEstadoJaula(String nombre){
          this.conectar();
          int cod = new EstadoJaulaDAO(this.getCon()).devolverCodigoEstadoJaula(nombre);
          this.desconectar();
          return cod;
      }
      /*
       * Metodo que devuelve el codigo de una camara, recibe como parametro
       * el nombre de la camara y el codigo del tipo de camara
       *
       */
      public int getCodigoCamara(String nombre, int codigoTipoCamara){
          this.conectar();
          int cod = -1;
          cod = new CamaraDAO(this.getCon()).getCodigoCamara(nombre, codigoTipoCamara);
          this.desconectar();
          return cod;
      }

      /*
       * Metodo que devuelve el codigo de una bateria, recibe como parametro
       * el nombre de la bateria y el codigo de la camara
       *
       */
      public int getCodigoBateria(String nombre, int codigoCamara){
          this.conectar();
          int cod = new BateriaDAO(this.getCon()).devolverCodigoBateria(nombre, codigoCamara);
          this.desconectar();
          return cod;
      }

     /*
     * FIN TERCERA PARTE!!!!
     */
//*****************************************************************************************************\\



     /*
      * CUARTA PARTE!!!!!
      * En esta parte se declaran los metodos de prueba que tienen o no que ver con la base PampaChin
      * No prestarle atencion!
      */
     /*
      * Metodo de prueba para el temma del nombre del animal. Este metodo se debe aplicar en los
      * JFrame, no aca!
      *
      */
     
    /*
     * Metodo que muestra una letra para un determinado año
     */
     public void traerLetra(int año){
         this.conectar();
         AnimalDAO_facu ani = new AnimalDAO_facu(this.getCon());
         ani.traerLetra(año);
         this.desconectar();
     }
    /*
     * Metodo que devuelve el codigo de TpoCamara de acuerdo a su nombre
     */
    public int metodoPruebaTipoCmanara(String nombre){
        int cod=0;
        this.conectar();
        cod =new TipoCamaraDAO(this.getCon()).devolverCodigoCamara(nombre);
        this.desconectar();
        return cod;
    }
    /*
     * Metodo de prueba para insetar un tipo de evento
     */
    public boolean metodoInsertaTipoEvento(TipoEvento tipo){
        this.conectar();
        boolean ret = false;
        ret = new TipoEventoDAO(this.getCon()).put(tipo);
        return ret;
    }
   /*
    * Metodo de prueba, que trae un animal pero de otra base..
    */
//     public Animal2 getAnimal2(String nombre){
//        this.conectar();
//        Animal2 ani =new AnimalDAO(this.getCon()).getAnimal2(nombre);
//        this.desconectar();
//        return ani;
//    }
    /*
     * FIN CUARTA PARTE!!!!
     */
//*****************************************************************************************************\\
}



